﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Orange.DesignPattern
{
    class Singleton
    {
        private static Singleton uniqueInstance;

        // 定义一个标识确保线程同步
        private static readonly object locker = new object();

        private Singleton() { }

        public static Singleton GetInstance()
        {
            // 
            // lock关键字真是很神奇，做成关键字连导入个库都不用了
            // 这里有个疑问，为什么locker需要加锁，因为是静态变量，那么应该多线程都能访问啊。假如入两个线程一起访问，当实例都还没有建立成功的时候，就会生出两个对象啊。
            // 双重锁定，为什么？若是uniqueInstance已经创建好了，不需要lock这里判断是否已经加锁，减少内存开销。
            if (uniqueInstance == null)
            {
                lock (locker)
                {
                    // unqueInstance在多线程访问的时候，若是不锁会返回为空
                    if (uniqueInstance == null)
                    {
                        uniqueInstance = new Singleton();
                    }
                }
            }
            return uniqueInstance;
        }
    }
}
